#include "server.h"
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>

int handle_login(ServerInfo* server, int client_index, const char* username, const char* password) {
    Message response;
    ClientInfo* client = &server->clients[client_index];
    char user_dir[PATH_MAX];
    struct stat st = {0};

    // 构造用户根目录路径
    // ??? 要改
    snprintf(user_dir, PATH_MAX, "%s/%s", FTP_ROOT_DIR, username);

    // 检查用户目录是否存在
    // 检查用户目录是否存在且是一个目录
    if (stat(user_dir, &st) == 0 && S_ISDIR(st.st_mode)) {
        // 用户目录存在，登录成功
        client->is_logged_in = true;  // 设置登录状态为真
        strncpy(client->username, username, MAX_USERNAME_LEN);  // 复制用户名到客户端信息结构
        // ??? 加密码
        strncpy(client->password, password, MAX_USERNAME_LEN);
        snprintf(client->root_dir, PATH_MAX, "%s", user_dir);  // 设置用户根目录
        strcpy(client->current_dir, "/");  // 初始化当前目录为根目录
        response.type = MSG_TYPE_LOGIN_SUCCESS;  // 设置响应类型为登录成功
        response.length = snprintf(response.data, sizeof(response.data), "登录成功");  // 设置响应消息
        printf("用户 %s 登录成功\n", username);  // 打印登录成功信息
    } else {
        // 用户目录不存在，登录失败
        response.type = MSG_TYPE_LOGIN_FAIL;  // 设置响应类型为登录失败
        response.length = snprintf(response.data, sizeof(response.data), "登录失败,用户不存在");  // 设置响应消息
        printf("用户 %s 登录失败\n", username);  // 打印登录失败信息
    }

    // 发送登录响应消息给客户端
    if (send_message(client->socket, &response) < 0) {
        perror("发送登录响应失败");  // 如果发送失败，打印错误信息
        return -1;  // 返回错误状态
    }

    // 返回登录结果：如果登录成功返回0，否则返回-1
    return client->is_logged_in ? 0 : -1;
}